Tomcat热部署与热加载

您所在的位置:网站首页 eclipse tomcat 热部署 Tomcat热部署与热加载

Tomcat热部署与热加载

2023-05-26 08:46| 来源: 网络整理| 查看: 265

热部署和热加载是类似的,都是在不重启Tomcat的情况下,使得应用的最新代码生效。 热部署表示重新部署应用,它的执行主体是Host,表示主机。 热加载表示重新加载class,它的执行主体是Context,表示应用。

Tomcat中的后台线程

热部署和热加载都需要监听相应的文件或文件夹是否发生了变化。它们都是由Tomcat的后台线程触发的。

BackgroundProcessor就表示后台线程。 每个容器都可以拥有一个BackgroundProcessor,但是默认情况下只有Engine容器会在启动的时候启动一个BackgroundProcessor线程。 该线程会每隔一段时间(可以设置,单位为秒),去执行后台任务,先执行本容器定义的后台任务,然后再执行子容器的定义的后台任务,子容器的任务执行完成后会继续执行其子容器的任务,直到没有子容器为止。从这里可以看出就算每个容器自己开启一个BackgroundProcessor,也只不过是多了一个执行相同任务的线程而已,执行任务的效率有所提升。

对于后台任务,所有容器会有一些统一的任务需要执行:

1、集群服务器心跳 2、如果一个容器拥有自己的类加载器,那么查看是否需要进行热加载 3、检查Session是否过 4、执行每个容器对于的Realm对应的后台任务 5、执行每个容器中pipeline中的每个valve的后台任务 6、发布PERIODIC_EVENT事件

在这个过程中的第2步中会触发热加载,第6步中会触发热部署。

热加载

我们可以在Context上配置reloadable属性为true,这样就表示该应用开启了热加载功能,默认是false。

热加载触发的条件是: 1、WEB-INF/classes目录下的文件发生了变化, 2、WEB-INF/lib目录下的jar包添加、删除、修改都会触发热加载。

看一下在Tomcat中是如何实现热加载的。Tomcat要监听class文件是否变化应该是新起了一个线程来观测。那么看到在Context的启动方法中,看到调用了threadStart的方法。

protected void threadStart() { backgroundProcessorFuture = Container.getService(this).getServer().getUtilityExecutor() .scheduleWithFixedDelay(new ContainerBackgroundProcessor(),//要执行的Runnable backgroundProcessorDelay, //第一次执行延迟多久 backgroundProcessorDelay, //之后每次隔多久执行一次 TimeUnit.SECONDS); //时间单位 } }

其中在后台开启周期性的任务,使用了Java提供的ScheduledThreadPoolExecutor。除了能周期性执行任务以外还有线程池的功能。上面代码中调用了scheduleWithFixedDelay 方法,第一个传入的参数就是要执行的任务。我们接下来看任务类ContainerBackgroundProcessor 是如何实现的

protected class ContainerBackgroundProcessor implements Runnable { @Override public void run() { // 请注意这里传入的参数是 " 宿主类 " 的实例 processChildren(ContainerBase.this); } protected void processChildren(Container container) { try { //1. 调用当前容器的 backgroundProcess 方法。 container.backgroundProcess(); //2. 遍历所有的子容器,递归调用 processChildren, // 这样当前容器的子孙都会被处理 Container[] children = container.findChildren(); for (int i = 0; i < children.length; i++) { // 这里会判断子容器如果已经启动了后台线程,那么这里就不会启动了 if (children[i].getBackgroundProcessorDelay()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3